جزوه · چالش‌های فصل اول: فرمان tee بازگشت به فهرست
📘 چالش‌های فصل اول فرمان tee
📅 تاریخ: ۱۹ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

فرمان tee یکی از ابزارهای مفید لینوکس است که خروجی یک دستور را هم به صفحه نمایش (STDOUT) می‌فرستد و هم در یک فایل ذخیره می‌کند. یعنی مثل یک لوله (Pipe) عمل می‌کند که یک انشعاب دارد.

🔑 مفهوم اصلی:

tee از نام یک لوله‌ی اتصال T شکل در لوله‌کشی گرفته شده است که آب را به دو مسیر مختلف هدایت می‌کند. در لینوکس، tee خروجی را به دو مسیر می‌فرستد:

  • مسیر اول: صفحه نمایش (STDOUT) — تا کاربر ببیند
  • مسیر دوم: یک فایل — تا ذخیره شود

▍ نمایش تصویری

command tee (نمایش در ترمینال)
                ↓
              فایل

▍ ساختار کلی

command | tee [options] file(s)

توضیح: خروجی command از طریق | (Pipe) به tee داده می‌شود و tee آن را هم در ترمینال نمایش می‌دهد و هم در فایل(های) مشخص شده ذخیره می‌کند.

▍ مثال‌های عملی (بر اساس عکس)

• کپی فایل passwd

┌──(ya3in㉿kali)-[~/test] └─$ cp /etc/passwd . └─$ ls ip m passwd

توضیح: فایل /etc/passwd را در دایرکتوری جاری کپی می‌کند.

• جستجوی root با grep

┌──(ya3in㉿kali)-[~/test] └─$ cat passwd | grep root root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:117:126:NetworkManager OpenVPN,,,,/var/lib/openvpn/chroot:/usr/sbin/nologin

توضیح: نمایش خطوطی از passwd که شامل root هستند.

• جستجوی دقیق root با ^root

┌──(ya3in㉿kali)-[~/test] └─$ cat passwd | grep root | grep ^root root:x:0:0:root:/root:/bin/bash

توضیح: خطوطی که با root شروع می‌شوند (کاربر اصلی root).

• ذخیره در فایل با > (بدون tee)

┌──(ya3in㉿kali)-[~/test] └─$ cat passwd | grep root | grep ^root > mohammad └─$ ls ip m mohammad passwd

توضیح: خروجی در فایل mohammad ذخیره می‌شود، اما در ترمینال نمایش داده نمی‌شود.

⚠️ نکته:

استفاده از > خروجی را فقط در فایل ذخیره می‌کند و در ترمینال نمایش نمی‌دهد.

• استفاده از tee برای نمایش و ذخیره همزمان

┌──(ya3in㉿kali)-[~/test] └─$ cat passwd | grep root | tee root.txt | grep ^root > mohammad └─$ ls ip m mohammad passwd root.txt

توضیح:

  1. cat passwd | grep root → خطوط حاوی root را پیدا می‌کند.
  2. tee root.txt → خروجی را در root.txt ذخیره می‌کند و همزمان در ترمینال نمایش می‌دهد.
  3. grep ^root > mohammad → از خروجی tee، خطوطی که با root شروع می‌شوند را در mohammad ذخیره می‌کند.
✅ نتیجه:
  • فایل root.txt شامل همه خطوط حاوی root است.
  • فایل mohammad فقط شامل خطی است که با root شروع می‌شود.
  • هر دو خروجی در ترمینال نمایش داده شدند (چون tee آنها را چاپ کرد).

▍ گزینه‌های مهم tee

گزینه توضیح مثال
-a یا --append خروجی را به انتهای فایل اضافه می‌کند (بازنویسی نمی‌کند) echo "new" | tee -a file.txt
-i یا --ignore-interrupts سیگنال‌های وقفه (Interrupt) را نادیده می‌گیرد command | tee -i file.txt

▍ مثال‌های پیشرفته

• نوشتن در چند فایل با tee

┌──(ya3in㉿kali)-[~] └─$ echo "Hello" | tee file1.txt file2.txt file3.txt

توضیح: "Hello" را در سه فایل مختلف ذخیره می‌کند و در ترمینال هم نمایش می‌دهد.

• افزودن به فایل با -a

┌──(ya3in㉿kali)-[~] └─$ echo "World" | tee -a file1.txt

توضیح: "World" را به انتهای file1.txt اضافه می‌کند و در ترمینال نمایش می‌دهد.

• استفاده از tee با sudo

┌──(ya3in㉿kali)-[~] └─$ echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf

توضیح: با استفاده از sudo tee، می‌توانید در فایل‌های سیستمی که نیاز به دسترسی روت دارند، بنویسید.

⚠️ توجه:

استفاده از sudo echo > file کار نمی‌کند، زیرا > توسط شل (نه توسط echo) اجرا می‌شود. برای نوشتن در فایل‌های سیستمی، از sudo tee استفاده کنید.

▍ جدول مقایسه

دستور خروجی در ترمینال ذخیره در فایل
command ✅ بله ❌ خیر
command > file ❌ خیر ✅ بله (بازنویسی)
command >> file ❌ خیر ✅ بله (افزودن)
command \| tee file ✅ بله ✅ بله (بازنویسی)
command \| tee -a file ✅ بله ✅ بله (افزودن)
✅ تمرین پیشنهادی:
  • خروجی ifconfig را با tee در network.txt ذخیره کنید و همزمان در ترمینال ببینید.
  • با tee -a خروجی date را به انتهای یک فایل اضافه کنید.
  • با sudo tee یک تنظیم جدید به /etc/hosts اضافه کنید.
  • خروجی یک دستور را با tee در دو فایل مختلف ذخیره کنید.